﻿using System;
using System.Windows.Forms;
using System.Net;
using vk;
using System.IO;
using Newtonsoft.Json.Linq;
using System.Diagnostics;
using System.Web;
using System.ComponentModel;
using System.Collections.Generic;
public partial class Form1 : Form
{
    const int AppID = 2447165;
    private string access_token = null;
    private string user_id = null;
    private List<string> files;
    private int index;


    public Form1()
    {
        InitializeComponent();
    }

    public bool Authorize()
    {
        //стираем данные о предыдущей авторизации
        access_token = null;
        user_id = null;
        //создаем форму авторизации
        AuthForm authform = new AuthForm();
        //получаем объект компонента WebBrowser
        WebBrowser browser = (WebBrowser)authform.Controls["webBrowser"];
        //Подписываемся на событие Navigated в функции Authorize_proceed
        browser.Navigated += new WebBrowserNavigatedEventHandler(Authorize_proceed);
        //переходим на страницу авторизации с нужными нам данными.
        browser.Navigate("http://api.vkontakte.ru/oauth/authorize?client_id=" + AppID.ToString() +
           "&scope=audio&redirect_uri=" +
           "http://api.vkontakte.ru/blank.html&display=popup&response_type=token");
        //показываем диалог авторизации
        authform.ShowDialog();

        //проверяем были ли мы авторизованы и возвращаем значение
        return access_token != null && user_id != null;
    }

    private void Authorize_proceed(object sender, WebBrowserNavigatedEventArgs e)
    {
        //Разбираем ссылку на кусочки
        string[] parts = e.Url.AbsoluteUri.Split('#');
        //получаем объект браузера
        WebBrowser browser = (WebBrowser)sender;
        //получаем объект формы авторизации
        AuthForm authform = (AuthForm)browser.Parent;

        //проверяем, что нас перенаправили на нужный адрес при успешной авторизации
        if (parts[0] == "http://api.vkontakte.ru/blank.html")
        {
            //если ошибка, закрываем форму
            if (parts[1].Substring(0, 5) == "error") authform.Close();
            //если авторизация успешна
            else if (parts[1].Substring(0, 12) == "access_token")
            {
                //разбираем ответ
                parts = parts[1].Split('&');

                //записываем данные
                access_token = parts[0].Split('=')[1];
                user_id = parts[2].Split('=')[1];
                //закрываем форму авторизации
                authform.Close();
            }
        }
        else
        {
            //неизвестный ответ при неудачном входе и нажатии кнопки "отмена"
            parts = e.Url.AbsoluteUri.Split('?');
            if (parts[0] == "http://api.vkontakte.ru/oauth/grant_access")
                //снова переходим к авторизации
                browser.Navigate("http://api.vkontakte.ru/oauth/authorize?client_id=" + AppID.ToString() +
                   "&scope=photos&redirect_uri=" +
                   "http://api.vkontakte.ru/blank.html&display=popup&response_type=token");
        }
    }

    private void button1_Click(object sender, EventArgs e)
    {
        files = new List<string>();
        index = 0;
        listBox1.Items.Clear();
        if (textBox1.Text == "")
        {
            textBox1.Text = user_id;
        }
        if (textBox2.Text == "")
        {
            textBox2.Text = Path.GetDirectoryName(Application.ExecutablePath) + "\\";
        }
        if (!Directory.Exists(textBox2.Text))
        {
            try
            {
                Directory.CreateDirectory(textBox2.Text);
            }
            catch (Exception err)
            {
                listBox1.Items.Add("couldn't init directory path");
                return;
            }
        }
        string tmp = @"https://api.vkontakte.ru/method/audio.get?uid=" + textBox1.Text + "&access_token=" + access_token;
        WebRequest reqGET = System.Net.WebRequest.Create(tmp);
        WebResponse responseString = reqGET.GetResponse();
        Stream stream = responseString.GetResponseStream();
        StreamReader sr = new System.IO.StreamReader(stream);
        string json = sr.ReadToEnd();
        Console.WriteLine(json);
        JObject o = JObject.Parse(json);
        JArray response = (JArray)o["response"];
        listBox1.Items.Add("have " + response.Count + " files to download. Started downloading");
        timer1.Enabled = true;
        WebDownloader.current.downloader.DownloadFileCompleted += new AsyncCompletedEventHandler(Completed);
        foreach (JToken resp in response)
        {
            string fileName = WebUtility.HtmlDecode(resp["artist"].ToString()) + "-" +WebUtility.HtmlDecode(resp["title"].ToString()) + ".mp3";
            files.Add(fileName);
            WebDownloader.current.DownloadFile(resp["url"].ToString(), textBox2.Text + fileName);
        }
    }

    private void Completed(object sender, AsyncCompletedEventArgs e)
    {
        listBox1.Items.Add("downloaded " + files[index]);
        if (++index == files.Count)
        {
            listBox1.Items.Add("finished");
            timer1.Enabled = false;
        }
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        Authorize();
    }

    private void button2_Click(object sender, EventArgs e)
    {
        DialogResult result = folderBrowserDialog1.ShowDialog();
        if (result == DialogResult.OK)
        {
            textBox2.Text = folderBrowserDialog1.SelectedPath + "\\";
        }
    }

    private void button3_Click(object sender, EventArgs e)
    {
        if (WebDownloader.current.downloader.IsBusy)
        {
            WebDownloader.current.CancelAll();
            listBox1.Items.Add("cancelled");
            timer1.Enabled = false;
        }
    }

    private void timer1_Tick(object sender, EventArgs e)
    {
        if (WebDownloader.current.downloader.IsBusy)
        {
            listBox1.Items.Add("still downloading");
        }
    }

   
}
